#ifndef THREAD10_H
#define THREAD10_H

#include <stdint.h>
#include <pthread.h>
#include <time.h>
#include <stdatomic.h>
#include "log_utils.h"

// 原子变量初始化宏（兼容性处理）
#ifndef ATOMIC_VAR_INIT
#define ATOMIC_VAR_INIT(value) (value)
#endif

// 传感器数据类型枚举
typedef enum {
    SENSOR_PROX1 = 0,    // 接近传感器1 (线程4)
    SENSOR_PROX2,        // 接近传感器2 (线程5)
    SENSOR_NAV,          // 组合导航系统 (线程8)
    SENSOR_RS485,        // RS485传感器 (线程9)
    SENSOR_COUNT         // 传感器总数
} sensor_type_t;

// 接近传感器数据结构 (从线程4/5获取)
typedef struct {
    uint8_t sensor_state;    // 传感器状态：0=检测到物体(有效)，1=未检测到(无效)
    uint32_t timestamp;      // 时间戳
    atomic_bool is_valid;    // 数据有效性标志
} prox_sensor_data_t;

// 导航传感器数据结构 (从线程8获取)
typedef struct {
    double latitude;         // 纬度，单位：度
    double longitude;        // 经度，单位：度
    float altitude;          // 高程，单位：m
    float heading;           // 航向角，单位：度
    float pitch;             // 俯仰角，单位：度
    float roll;              // 横滚角，单位：度
    float north_velocity;    // 北向速度，单位：m/s
    float east_velocity;     // 东向速度，单位：m/s
    float up_velocity;       // 天向速度，单位：m/s
    char ins_status[32];     // INS状态字符串
    char pos_status[32];     // POS状态字符串
    uint32_t timestamp;      // 时间戳
    atomic_bool is_valid;    // 数据有效性标志
} nav_sensor_data_t;

// RS485传感器数据结构 (从线程9获取)
typedef struct {
    float wind_speed;        // 风速，单位：m/s
    float wind_direction;    // 风向，单位：度
    float temperature;       // 温度，单位：摄氏度
    float humidity;          // 湿度，单位：%RH
    float force_sensor1;     // 拉力传感器1，单位：N
    float force_sensor2;     // 拉力传感器2，单位：N
    float force_sensor3;     // 拉力传感器3，单位：N
    float force_sensor4;     // 拉力传感器4，单位：N
    uint32_t timestamp;      // 时间戳
    atomic_bool is_valid;    // 数据有效性标志
} rs485_sensor_data_t;

// 全局传感器数据快照结构 (用于线程6快速访问)
typedef struct {
    time_t timestamp;        // 快照时间戳
    
    // 接近传感器数据
    prox_sensor_data_t prox1;
    prox_sensor_data_t prox2;
    
    // 导航数据
    nav_sensor_data_t navigation;
    
    // RS485传感器数据
    rs485_sensor_data_t rs485;
    
    // 统计信息
    atomic_int total_sensors;
    atomic_int valid_sensors;
    atomic_int update_count;
} global_sensor_snapshot_t;

// 全局变量声明
extern global_sensor_snapshot_t g_sensor_snapshot;
extern pthread_rwlock_t g_sensor_snapshot_rwlock;

// 线程10函数声明
void *thread10_function(void *arg);

// 线程控制函数
void thread10_stop(void);
int thread10_is_running(void);

// 数据访问接口函数 (供线程6使用)
int get_sensor_snapshot(global_sensor_snapshot_t *snapshot);
int get_prox1_data(prox_sensor_data_t *data);
int get_prox2_data(prox_sensor_data_t *data);
int get_nav_data(nav_sensor_data_t *data);
int get_rs485_data(rs485_sensor_data_t *data);

// 数据有效性检查函数
int is_sensor_data_valid(sensor_type_t sensor_type);
int is_all_sensor_data_valid(void);

// 传感器就绪检查函数
int check_sensors_ready(void);

// 调试函数
void debug_sensor_data(void);
void print_sensor_snapshot(const global_sensor_snapshot_t *snapshot);

// 锁超时配置
#define LOCK_TIMEOUT_MS 100        // 锁超时时间（毫秒）
#define LOCK_RETRY_COUNT 3         // 锁重试次数

// 传感器超时配置
#define SENSOR_DATA_TIMEOUT 10     // 正常运行阶段传感器数据超时时间（秒）
#define STARTUP_TIMEOUT_MS 5000    // 启动阶段超时时间（毫秒）
#define STARTUP_GRACE_PERIOD 5     // 启动阶段宽限期（秒），在此期间不检查超时

// 传感器启动时间配置（不同类型传感器的预期启动时间）
#define SENSOR_STARTUP_GPIO_MS     500     // GPIO传感器启动时间（毫秒）
#define SENSOR_STARTUP_RS485_MS    2000    // RS485传感器启动时间（毫秒）
#define SENSOR_STARTUP_NAV_MS      4000    // 导航传感器启动时间（毫秒）

// 锁超时函数声明
int try_rwlock_wrlock_timeout(pthread_rwlock_t *rwlock, int timeout_ms);
int try_rwlock_rdlock_timeout(pthread_rwlock_t *rwlock, int timeout_ms);

// 安全的锁操作宏
#define SAFE_WRLOCK_TIMEOUT(rwlock, timeout_ms) \
    do { \
        if (try_rwlock_wrlock_timeout(rwlock, timeout_ms) != 0) { \
            LOG_ERROR(LOG_TO_FILE, THREAD10_MODULE, "写锁获取超时"); \
            return -1; \
        } \
    } while(0)

#define SAFE_RDLOCK_TIMEOUT(rwlock, timeout_ms) \
    do { \
        if (try_rwlock_rdlock_timeout(rwlock, timeout_ms) != 0) { \
            LOG_ERROR(LOG_TO_FILE, THREAD10_MODULE, "读锁获取超时"); \
            return -1; \
        } \
    } while(0)

#endif /* THREAD10_H */ 